#include <stdio.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <errno.h>
#include <unistd.h>

union  semun
{
    int val;
};


int main(int argc,char const* argv[])
{
    key_t key=ftok("./app",'a');
    if (-1==key)
    {
        perror("ftok err\n");
        return -1;
    }
    printf("%#x\n",key);

    int semid=semget(key,2,IPC_CREAT|IPC_EXCL|0666);
    if (-1==semid)
    {
        if (errno==EEXIST)
        {
            semid=semget(key,2,0666);
        }
        else
        {
            perror("semget err\n");
            return -1;
        }
    }
    else
    {
        union semun sem;
        sem.val=10;
        semctl(semid,0,SETVAL,sem);

        sem.val=0;
        semctl(semid,1,SETVAL,sem);
    }
    printf("semid:%d\n",semid);

    printf("%d\n",semctl(semid,0,GETVAL));
    printf("%d\n",semctl(semid,1,GETVAL));

    struct sembuf sb;
    sb.sem_num=0;
    sb.sem_op=-1;
    sb.sem_flg=0;
    semop(semid,&sb,1);

    sb.sem_num=1;
    sb.sem_op=1;
    sb.sem_flg=0;
    semop(semid,&sb,1);

    printf("PV after:%d\n",semctl(semid,0,GETVAL));
    printf("PV after:%d\n",semctl(semid,1,GETVAL));

    semctl(semid,0,IPC_RMID);

    return 0;
}